package com.hyx.spring.config;

import com.hyx.spring.bean.Department;
import com.hyx.spring.bean.Employee;
import com.hyx.spring.bean.Person;
import com.hyx.spring.bean.PersonFactoryBean;
import com.hyx.spring.config.condition.LinuxCondition;
import com.hyx.spring.config.condition.MyImportBeanDefinitionRegistrar;
import com.hyx.spring.config.condition.WindowsCondition;
import com.hyx.spring.config.selector.MyImportSelector;
import org.springframework.context.annotation.*;

/**
 * @Author hyx
 * @Description 测试懒加载 的类——未加@lazy时，可以看到，单实例bean在Spring容器启动的时候就会被创建，并加载到Spring容器中
 * 在person（）方法上加上@lazy——在获取bean的时候，创建了bean对象并加载到Spring容器中。
 * 总结：懒加载，也称延时加载。仅对单例bean生效。单例bean是在Spring容器启动的时候加载的，添加@Lazy
 * 注解后就会延迟加载，在Spring容器启动的时候并不会加载，而是在第一次使用此bean的时候才会加
 * 载，但当你多次获取bean的时候不会重复加载，只是在第一次获取的时候会加载，这不是延迟加载的特
 * 性，而是单例Bean的特性
 * @Date 2024/3/10 16:24
 * @Version 1.0
 */
@Configuration
@Import({Department.class, Employee.class, MyImportSelector.class,
        MyImportBeanDefinitionRegistrar.class})
public class PersonConfig2 {

    @Lazy
    @Bean("person")
    public Person person(){
        System.out.println("给容器中增加person...." );
        return new Person("BINGHE01",19,null);
    }

    /**
     * 注意：Conditional注解也可以标注在类上，标注在类上含义为：满足当前条件，这个类中配置的所有bean
     * 注册才能生效，大家可以自行验证@Conditional注解标注在类上的情况
     *
     */
    @Conditional({WindowsCondition.class})
    @Bean("binghe001")
    public Person person01(){
        return new Person("binghe001",18,null);
    }

    @Conditional({LinuxCondition.class})
    @Bean("binghe002")
    public Person person02(){
        return new Person("binghe002",18,null);
    }

    @Bean("personfactory")
    public PersonFactoryBean personFactoryBean(){
        return new PersonFactoryBean();
    }

}
